iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
AI/ ML & Data

使用 jq 處理資料系列 第 23

Day23: jq 自定義函式

  • 分享至 

  • xImage
  •  

昨天我們認識了字串轉數字tonumber,使用變數儲存蒲福風表,並套用到山陀兒的歷史資訊中,讓原本顯示中心風速與最大陣風風速顯示從原本的公尺/每秒,改為用蒲福級風顯示。今天我們來認識 jq 如何定義函式。

對話中學習

師傅:來,今天教你個新招。把經度提取出來。

徒弟:呃...是指從那個座標字串裡取出經度嗎?

師傅:對。現在怎麼寫?

徒弟:嗯...我記得是 .coordinate|split(",")[0] 吧?

師傅:沒錯。但如果要多次使用呢?

徒弟:啊...每次都要寫一遍嗎?那蠻麻煩的。

師傅:所以要用函式。看好了。

徒弟:函式?那是什麼?

師傅:就是把一段常用的程式碼打包起來,給它一個名字。用的時候直接叫這個名字就行。

徒弟:哦!聽起來很方便啊。那要怎麼寫呢?

師傅:看好了:

def get_longitude: .coordinate | split(",")[0];

徒弟:哇,這樣就行了?那使用的時候...?

師傅:使用時就寫 get_longitude 。簡單吧?

徒弟:真的耶!這樣程式碼看起來就清爽多了。謝謝師傅!

師傅:記住,def 後面接函式名,然後冒號,再寫函式內容。最後分號結束。

徒弟:明白了!我會好好練習的。


定義函式 (function)

jq 之中定義函式的語法是 def 函式名稱: 函式內容; ,其中 def:;都是必要的。對話中的例子,是沒有輸入參數的定義方式,如下:

def get_longitude: .coordinate | split(",")[0];

如果需要輸入參數,則是 def 函式名稱(參數1; 參數2): 函式內容;,如下

def get_longitude(f): f |split(",")[0];

原本的程式修改之後,大致如下:

jq -c -r -s "def seperate(f): f|split(\",\"); ...(略)... , seperate(.coordinate)[0], seperate(.coordinate)[1] ...

完整可以參考 原始碼

結論

今天認識了使用 jq 語法來定義函式(function),我們現在這個追蹤颱風消息的程式還有更多共用的函式可以提取,明天繼續定義更多函式來改善我們現有的程式吧。

感謝自己今天也認真的練習😊


上一篇
Day22: jq 字串轉數字
下一篇
Day24: 認識 generator 概念
系列文
使用 jq 處理資料30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言